www.gusucode.com > 串口测试程序,用于调试rs485接口 串口通信的程序 > 串口测试程序,用于调试rs485接口 串口通信的程序/commtest/MPZJ.cpp

    // MPZJ.cpp: implementation of the CMPZJ class.
//
//////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "MPZJ.h"
#include <stdlib.h>
#include <string.h>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//const  int CMPZJ::METER_GB_ITEM[1000] = {0,0};
CMPZJ::CMPZJ()
{

}
//tm
CMPZJ::~CMPZJ()
{

}
int CMPZJ::FormCheckClock(BYTE *buff,time_t *m_time , BYTE * addr)//设置电表时钟
{
	return 0;
}

int CMPZJ::FormReadDataFrame(BYTE *buff, int item , BYTE * addr)//读取数据
{
	int m_Item = CheckItem(item);
	if( m_Item == 0)
	    return 0;
	
	BYTE DI0 = m_Item & 0xFF;
	BYTE DI1 = (m_Item >> 8) & 0xFF ;
	buff[0] = 0xfe;
	buff[1] = 0x68;
	buff[2] = 0x03;
	buff[3] = 0x03;
	buff[4] = 0x68;
	buff[5] = addr[0];
	buff[6] = DI0;//控制码
	buff[7] = DI1;	//数据长度
	buff[8] = GetCheckSum(buff + 5, 3);
	buff[9] = 0x0D;
	buff[10]= 0x00;
	return 11;
}

int CMPZJ::FormSetAddress(BYTE *buff, BYTE *addr)//设置电表地址
{
	return 0;
}

int CMPZJ::ProcReturnedFrame(BYTE *inbuff, int inLen,int item, BYTE *outbuff,int &outlen,BYTE *addr)
{
	int i =0;
	while( i < (inLen - 7))//2*0x68 + 2 * Len + 1 * 0x0D + 1 * crc + 1 * addr
	{
		if(inbuff[i] == 0x68 && inbuff[i + 3] == 0x68 && inbuff[i + 1] == inbuff[i + 2])//找到数据帧头部
		{
		    break;
		}
		i++;
	}
	if(i >= (inLen - 7))//在有效数据长度内没有找到同步字
	{
		return 0x0100;//数据长度不正确
	}
	
	BYTE *pData = &inbuff[i];//数据起始
	BYTE Len  = pData[1] + 2 + 4;//2*0x68 + 2 * Len
	if(Len > inLen - i)
	{
		return 0x0100;
	}
	if(pData[Len - 1] != 0x0D)
	{
		return 0x0200;//没有结束标志
	}
	BYTE m_check = GetCheckSum(pData + 4,Len - 6);
	if(m_check != pData[Len - 2])
	{
		return 0x0300; //校验和不对
	}
	return ProcFullFrame( pData, item, outbuff, outlen, addr);
}
int CMPZJ::CheckItem(int Item_data)
{ 
	int data    = Item_data & 0x3FFF;//bit15 bit14 == 1 表示设置,==0 表示查询
	char LoBYTE = Item_data & 0xFF;
	char HiBYTE = ( Item_data & 0xFF00 ) >> 8;
	char LoBCD  = LoBYTE & 0x0F;
	char HiBCD  = (LoBYTE & 0xF0) >> 4;
	switch(HiBYTE)
	{
		case 0x01://当前电量
		case 0x02://上月电量 上月需量
		     if(LoBYTE == 0x00)
		          return data;
		     if((HiBCD >= 1 && HiBCD <= 6) && (LoBCD >= 0 &&LoBCD <= 5))
		          return data;		        
		     break;
		case 0x03:
		     if(LoBYTE == 0x00)
		          return data;
		     if(LoBYTE >= 0x10 && LoBYTE <= 0x18)
		          return data;
		     break;
		case 0x04:
		     if(LoBYTE == 0x00)
		          return data;
		     if(LoBYTE >= 0x10 && LoBYTE <= 0x1A)
		          return data;
		     break;		     
		case 0x05:
		     if(LoBYTE == 0x00)
		          return data;
		     if((LoBYTE >= 0x10 && LoBYTE <= 0x16 ) ||(LoBYTE >= 0x20 && LoBYTE <= 0x27))
		          return data;
		     break;
		case 0x06:
		     if(LoBYTE == 0x00)
		          return data;
		     if((LoBYTE >= 0x10 && LoBYTE <= 0x15 ) ||(LoBYTE >= 0x20 && LoBYTE <= 0x25))
		          return data;
		     break;
		case 0x07:
		     if(LoBYTE == 0x00)
		          return data;
		     if(LoBYTE >= 0x10 && LoBYTE <= 0x2F )
		          return data;
		     break;
		default:
		     return 0;
	}
	
	return 0;
}
int CMPZJ::ProcFullFrame(BYTE *data, int item,BYTE *outbuff,int &outlen, BYTE *addr)//返回完整数据帧处理
{
	if( addr[0] != data[4] )//地址不一侄
	{
		return 0x0400;//地址不一样
	}
	if(data[ 1 ] == 0x01)
	{
		return 0x0600;//终端无数据
	}
	if(data[ 1] == 0x02)
	{
		if(data[ 5 ] == 0xF0)
		      return 0x0600;//终端无数据;
		else
		      return 0;
	}
	if( item != (data[ 6 ] * 256 + data[5]))	
	      return  0x0500;
        outlen = (int) data[1] - 3;
	memcpy( (void *)outbuff, (void *)&data[7], data[1] - 3 );    
	return 0;
}


int CMPZJ::ChangeDataFromZJToGB(BYTE *pInData,BYTE pOutData,BYTE ItemZJ,BYTE ItemGB)
{
	return 0;
}
/////////////////////////////////////////////////////////////////////////////

typedef struct 
{
	int  Item;
	BYTE Len;
	BYTE Flags;
}ITEM_LEN;//数据项目的信息